home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Creative Computers
/
Creative Computers CD-ROM, Volume 1 (Legendary Design Technologies, Inc.)(1994).iso
/
shareware
/
fractals
/
apfelkiste
/
apfelkiste1.3
/
source
/
apfelkiste1.3src.lzh
/
Fixpoint.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-30
|
3KB
|
119 lines
/************************************************************************/
/* Fixpoint.c */
/* */
/* Fix-point version of the mandelbrot genrator. See Float.c for math */
/* details. The UPPER CASE variables contain the FXP counterparts of */
/* the ones written in lower case. */
/************************************************************************/
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <mffp.h>
#include <math.h>
/* -------------------------------------------------------------------- */
/* "Zwei hoch 24" is german for "two, powered by 24" or 2**24. */
/* Forgive me, I haven't had the patience to translate all variable */
/* names to english. */
/* -------------------------------------------------------------------- */
#define ZWEI_HOCH_24 16777216.0
/* -------------------------------------------------------------------- */
/* import externaly defined objects */
/* -------------------------------------------------------------------- */
extern struct RastPort *rp;
extern struct GfxBase *GfxBase;
extern long __asm Iter_FXP(register __d1 long r, register __d2 long i,register __a2 long divergenz);
extern short __regargs Test(long xx1, long yy1, long xx2, long yy2);
/* -------------------------------------------------------------------- */
long DIVERGENZ, RMIN, IMIN, DX, DY;
short MAXITER;
void __regargs Apfel_FXP(long x1, long y1, long x2, long y2)
{
long xneu, yneu, help1, help2;
if ( x2 - x1 > 1 && y2 - y1 > 1 ) {
if ( Test(x1, y1, x2, y2) ) {
SetAPen(rp, ReadPixel(rp, x1, y1));
RectFill(rp, x1+1, y1+1, x2-1, y2-1);
}
else {
if ( x2 - x1 + y1 > y2 ) {
xneu = (x1 + x2) >> 1;
help1 = RMIN + xneu * DX;
help2 = (y1 + 1) * DY + IMIN;
for ( yneu = y1 + 1; yneu < y2; yneu++ ) {
SetAPen(rp, Iter_FXP(help1, help2, DIVERGENZ));
WritePixel(rp, xneu, yneu);
help2 += DY;
}
Apfel_FXP(x1, y1, xneu, y2);
Apfel_FXP(xneu, y1, x2, y2);
}
else {
yneu = (y1 + y2) >> 1;
help1 = IMIN + yneu * DY;
help2 = (x1 + 1) * DX + RMIN;
for ( xneu = x1 + 1; xneu < x2; xneu++ ) {
SetAPen(rp, Iter_FXP(help2, help1, DIVERGENZ));
WritePixel(rp, xneu, yneu);
help2 += DX;
}
Apfel_FXP(x1, y1, x2, yneu);
Apfel_FXP(x1, yneu, x2, y2);
}
}
}
}
/* -------------------------------------------------------------------- */
/* Some initializations are needed for the FXP version. */
/* -------------------------------------------------------------------- */
void FixPoint(double rmin, double rmax, double imin, double imax, double dx, double dy,
int maxiter, double divergenz, int gx, int gy, int depth)
{
long help1, help2, help3, help4;
long x, y;
DIVERGENZ = divergenz * ZWEI_HOCH_24;
RMIN = rmin * ZWEI_HOCH_24;
IMIN = imin * ZWEI_HOCH_24;
DX = dx * ZWEI_HOCH_24;
DY = dy * ZWEI_HOCH_24;
MAXITER = maxiter - 1;
help1 = RMIN;
help4 = gy - 1;
help3 = imax * ZWEI_HOCH_24;
for ( x = 0; x < gx; x++ ) {
SetAPen(rp, Iter_FXP(help1, IMIN, DIVERGENZ));
WritePixel(rp, x, 0);
SetAPen(rp, Iter_FXP(help1, help3, DIVERGENZ));
WritePixel(rp, x, help4);
help1 += DX;
}
help1 = IMIN;
help2 = gx - 1;
help3 = rmax * ZWEI_HOCH_24;
for ( y = 0; y < gy; y++ ) {
SetAPen(rp, Iter_FXP(RMIN, help1, DIVERGENZ));
WritePixel(rp, 0, y);
SetAPen(rp, Iter_FXP(help3, help1, DIVERGENZ));
WritePixel(rp, help2, y);
help1 += DY;
}
Apfel_FXP(0, 0, help2, help4);
}